<!-- 
    Object.defineProperty(); 数据劫持 数据代理 计算属性都用到了这个方法
    - 作用: 为对象定义属性;
    - 参数:
        1. 对象 
        2. 属性名
        3. 配置项 
            => 基本配置项: value, enumerable, writable, configurable; 
            => 高级配置项: get,set;

    - 使用目的:
        1. 默认不可被枚举(在控制台中表现为浅色的属性名)[Object.keys()]; 
        2. 默认不可修改 (cat2.age = 100)
        3. 默认不可以被删除 (delete cat2.age)
        4. 需求: 让该属性的值永远等于某个变量
 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
</body>
<script>
    let num = 1; // [需求: age永远是num的值]

    let cat1 = {
        name: "Nico",
        sex: "male",
        age: 2,
    }
    let cat2 = {
        name: "Jingwen",
        sex: "male",
    };
    Object.defineProperty(cat2,'age',{
        // value: 18,
        // 控制枚举
        // enumerable: true,
        // 控制修改
        // writable: true,
        // 控制删除
        // configurable: true,

        // 读取时调用
        get(){
            return num;
        },
        // 修改时调用
        set(val){
            console.log(val);
            num = val;
        }
    });
    // console.log(cat1); console.log(Object.keys(cat1))
    console.log(cat2); console.log(Object.keys(cat2))
    cat2.age = 200;

</script>
</html>